var SessionService = require('../common/service/sessionService');
//session组件是sessionService的包装组件 证据在上面
module.exports = function(app, opts) {
  var cmp = new Component(app, opts);
  app.set('sessionService', cmp, true);//设置到app.settings并绑定到app.sessionService
  return cmp;
};

/**
 * Session component. Manage sessions.
 *
 * @param {Object} app  current application context
 * @param {Object} opts attach parameters
 */
var Component = function(app, opts) {
  opts = opts || {};
  this.app = app;
  this.service = new SessionService(opts);//创建并保存真正的会话服务引用

  var getFun = function(m) {
    return (function() {//这里为什么要用立即执行的匿名函数呢？？//如果有参数的话，有必要这么写，这个地方没必要呀
          return function() {//arguments是该函数的参数列表
            return self.service[m].apply(self.service, arguments);//self.service改变执行上下文指明当调用这些函数时，是在SessionService上执行
          };
    })();//立即执行的匿名函数
  };
    // proxy the service methods except the lifecycle interfaces of component
  //代理会话服务的方法，除了组件的生命周期函数
  var method, self = this;
  for(var m in this.service) {
    if(m !== 'start' && m !== 'stop') {//跳过生命周期函数
      method = this.service[m];//取到对应属性
      if(typeof method === 'function') {//该属性为函数
        this[m] = getFun(m);//保存引用
      }
    }
  }
};

Component.prototype.name = '__session__';
